﻿using System.Configuration;
using System.Data;
using MySql.Data.MySqlClient;

namespace DAL
{
    /**
     * 
     * Classe de base pour tous les DataProvider.
     * Spécifie toutes les fonctions génériques partagées par les enfants.
     * Permet donc :
     * - de récupérer le contenu d'une table
     * - de récupérer 1 record
     * - de supprimer un record
     * 
     **/
    public abstract class BaseDataProvider
    {
        // string de connexion vers la database MySQL
        protected string connString = ConfigurationManager.ConnectionStrings["connexion"].ConnectionString;

        /**
         * 
         * Renvoie tous les records d'une table
         * 
         **/
        public DataTable findAll()
        {
            DataTable dt = new DataTable();

            using (MySqlConnection conn = new MySqlConnection(this.connString))
            {
                conn.Open();
                MySqlDataAdapter adpt = new MySqlDataAdapter();
                adpt.SelectCommand = new MySqlCommand("SELECT * FROM " + getTable(), conn);
                adpt.Fill(dt);
            }

            return dt;
        }

        // trouve tous les records d'une table selon un where
        public DataTable findAll(DataTable where) { return null; }

        /**
         * 
         * Renvoie 1 record d'une table selon l'id passé en paramètre
         * 
        **/
        virtual public DataRow findOne(int id)
        {
            DataTable dataDT = new DataTable();

            using (MySqlConnection conn = new MySqlConnection(this.connString))
            {
                conn.Open();
                MySqlDataAdapter adpt = new MySqlDataAdapter();
                adpt.SelectCommand = new MySqlCommand("SELECT * FROM " + getTable() + " WHERE " + getId() + " = @id", conn);
                adpt.SelectCommand.Parameters.AddWithValue("@id", id);
                adpt.Fill(dataDT);
            }

            if (dataDT.Rows.Count > 0)
                return dataDT.Rows[0];
            else
                return null;
        }

        // trouve un record selon un where
        public DataRow findOne(DataTable where) { return null; }
        // supprime un un record selon un where

        /**
         * 
         * Supprime un record selon son id
         * 
         **/
        public bool delete(int id)
        {
            using (MySqlConnection conn = new MySqlConnection(this.connString))
            {
                conn.Open();
                MySqlCommand cmd = new MySqlCommand("DELETE FROM " + getTable() + " WHERE " + getId() + " = @id", conn);
                cmd.Parameters.AddWithValue("@id", id);

                cmd.ExecuteNonQuery();
            }
            return true;
        }

        /**
         * 
         * Récupère le nom de la tablie liée au DP
         * 
         */
        abstract public string getTable();

        /**
         * 
         * Récupère le nom de la clé primaire
         * 
         **/
        abstract public string getId();
    }
}
